home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / DJGPP / CBGRX103.ZIP / contrib / libgrx / src / textsize.c < prev    next >
Text File  |  1993-12-06  |  4KB  |  156 lines

  1. /**
  2.  ** TEXTSIZE.C
  3.  **
  4.  **  Copyright (C) 1992, Csaba Biegl
  5.  **    820 Stirrup Dr, Nashville, TN, 37221
  6.  **    csaba@vuse.vanderbilt.edu
  7.  **
  8.  **  This file is distributed under the terms listed in the document
  9.  **  "copying.cb", available from the author at the address above.
  10.  **  A copy of "copying.cb" should accompany this file; if not, a copy
  11.  **  should be available from where this file was obtained.  This file
  12.  **  may not be distributed without a verbatim copy of "copying.cb".
  13.  **  You should also have received a copy of the GNU General Public
  14.  **  License along with this program (it is in the file "copying");
  15.  **  if not, write to the Free Software Foundation, Inc., 675 Mass Ave,
  16.  **  Cambridge, MA 02139, USA.
  17.  **
  18.  **  This program is distributed in the hope that it will be useful,
  19.  **  but WITHOUT ANY WARRANTY; without even the implied warranty of
  20.  **  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  21.  **  GNU General Public License for more details.
  22.  **/
  23. #include <stdio.h>
  24. #include <stdlib.h>
  25.  
  26. #include "grx.h"
  27. #include "libgrx.h"
  28. #include "grxfont.h"
  29.  
  30. GrFont *_GrDefaultFont = NULL;
  31.  
  32. GrFont *_GrGetDefaultFont(void)
  33. {
  34.     _GrDefaultFont = GrLoadBIOSFont("@:pc8x14.fnt");
  35.     if(_GrDefaultFont == NULL) {
  36.         GrSetMode(GR_default_text);
  37.         fputs("Cannot find default font: \"@:pc8x14.fnt\"\n",stderr);
  38.         exit(1);
  39.     }
  40.     return(_GrDefaultFont);
  41. }
  42.  
  43. int _GrGetTextSize(char *txt,int len,int *w,int *h,GrTextOption *opt)
  44. {
  45.     GrFont *font = CHECK_FONT(opt->txo_font);
  46.     int ww,hh,chr;
  47.  
  48.     if((font == NULL) || (opt->txo_xmag <= 0) || (opt->txo_ymag <= 0)) {
  49.         *w = 0;
  50.         *h = 0;
  51.         return(FALSE);
  52.     }
  53.     if(font->fnt_isfixed) {
  54.         ww = font->fnt_width  * opt->txo_xmag * len;
  55.         hh = font->fnt_height * opt->txo_ymag;
  56.     }
  57.     else {
  58.         for(ww = 0; --len >= 0; ) {
  59.         switch(opt->txo_chrtype) {
  60.           case GR_WORD_TEXT:
  61.             chr = *((unsigned short *)txt)++;
  62.             break;
  63.           case GR_ATTR_TEXT:
  64.             chr = *((short *)txt)++ & 0xff;
  65.             break;
  66.           default:
  67.             chr = *((unsigned char *)txt)++;
  68.             break;
  69.         }
  70.         if(chr > font->fnt_maxchar) continue;
  71.         if((chr -= font->fnt_minchar) < 0) continue;
  72.         ww += PFP(font)->pf_width[chr];
  73.         }
  74.         ww *= opt->txo_xmag;
  75.         hh = font->fnt_height * opt->txo_ymag;
  76.     }
  77.     switch(opt->txo_direct) {
  78.       case GR_TEXT_DOWN:
  79.         *w = (-hh);
  80.         *h = ww;
  81.         break;
  82.       case GR_TEXT_LEFT:
  83.         *w = (-ww);
  84.         *h = (-hh);
  85.         break;
  86.       case GR_TEXT_UP:
  87.         *w = hh;
  88.         *h = (-ww);
  89.         break;
  90.       default:
  91.         *w = ww;
  92.         *h = hh;
  93.     }
  94.     return(TRUE);
  95. }
  96.  
  97. int GrStringWidth(char *text,int length,GrTextOption *opt)
  98. {
  99.     int ww,hh;
  100.  
  101.     _GrGetTextSize(text,length,&ww,&hh,opt);
  102.     return(IABS(ww));
  103. }
  104.  
  105. int GrStringHeight(char *text,int length,GrTextOption *opt)
  106. {
  107.     int ww,hh;
  108.  
  109.     _GrGetTextSize(text,length,&ww,&hh,opt);
  110.     return(IABS(hh));
  111. }
  112.  
  113. int GrCharWidth(int chr,GrTextOption *opt)
  114. {
  115.     char buff[1];
  116.  
  117.     buff[0] = chr;
  118.     return(GrStringWidth(buff,1,opt));
  119. }
  120.  
  121. int GrCharHeight(int chr,GrTextOption *opt)
  122. {
  123.     char buff[1];
  124.  
  125.     buff[0] = chr;
  126.     return(GrStringHeight(buff,1,opt));
  127. }
  128.  
  129. static int fontsize(GrTextOption *opt,int which)
  130. {
  131.     GrFont *font = CHECK_FONT(opt->txo_font);
  132.     int w,h;
  133.  
  134.     if(font == NULL) return(0);
  135.     w = opt->txo_xmag * font->fnt_width;
  136.     h = opt->txo_ymag * font->fnt_height;
  137.     switch(opt->txo_direct) {
  138.       case GR_TEXT_DOWN:
  139.       case GR_TEXT_UP:
  140.         return(which ? w : h);
  141.       default:
  142.         return(which ? h : w);
  143.     }
  144. }
  145.  
  146. int GrFontWidth(GrTextOption *opt)
  147. {
  148.     return(fontsize(opt,0));
  149. }
  150.  
  151. int GrFontHeight(GrTextOption *opt)
  152. {
  153.     return(fontsize(opt,1));
  154. }
  155.  
  156.